from pyexpat.errors import messages

import wtforms
from wtforms.fields.numeric import IntegerField
from wtforms.validators import Email, Length, EqualTo, InputRequired
from models import UserModel, EmailCaptchaModel
from exts import db
import email_validator

#Form：主要就是用来验证前端提交的数据是否符合要求
class RegisterForm(wtforms.Form):
    email = wtforms.StringField(validators=[Email(message='邮箱格式错误！')])
    captcha = wtforms.StringField(validators=[Length(min=4, max=4, message='验证码格式错误！')])
    username = wtforms.StringField(validators=[Length(min=3,max=20,message='用户名格式错误')])
    password = wtforms.StringField(validators=[Length(min=6, max=20, message='密码格式错误！')])
    password_confirm =  wtforms.StringField(validators=[EqualTo("password",message='两次密码不一致！')])

    # 自定义验证
    # 1. 邮箱是否已经被注册
    def validate_email(self, field):
        email = field.data
        user = UserModel.query.filter_by(email=email).first()
        if user:
            raise wtforms.ValidationError(message='该邮箱已经被注册！')

    # 2. 验证码是否正确
    def validate_captcha(self, field):
        captcha = field.data
        email = self.email.data
        captcha_model =  EmailCaptchaModel.query.filter_by(email=email, captcha=captcha).first()
        if not captcha_model:
            raise wtforms.ValidationError(message='邮箱或验证码错误！')
        # 可以删掉captcha_model，因为验证只要用一次验证码
        # 另一种思路：回到models.py中对EmailCaptchaModel进行修改，增加used字段，表明是否过期
        else:
            db.session.delete(captcha_model)
            db.session.commit()

class LoginForm(wtforms.Form):
    email = wtforms.StringField(validators=[Email(message='邮箱格式错误！')])
    password = wtforms.StringField(validators=[Length(min=6, max=20, message='密码格式错误！')])


class QuestionForm(wtforms.Form):
    title = wtforms.StringField(validators=[Length(min=2, max=100, message="标题格式错误，长度为3到100之间！")])
    content = wtforms.StringField(validators=[Length(min=3,message="内容格式错误，并且长度至少为三")])


class AnswerForm(wtforms.Form):
    content = wtforms.StringField(validators=[Length(min=3, message="内容格式错误，并且长度至少为三")])
    question_id = wtforms.IntegerField(validators=[InputRequired(message="必须要传入问题id")])